#ifndef GY_BEZEL_H
#define GY_BEZEL_H

#include "GY_ContainerTransform.h"
#include "GY_ControlLibrary_global.h"
#include "Graphics/BasicGraphics/GY_GraphicsPolygon.h"
#include "Graphics/BasicGraphics/GY_GraphicsRectItem.h"
#include "Graphics/DataObjects/GY_ColorArray.h"

class GY_CONTROLLIBRARY_EXPORT GY_Bezel : public GY_ContainerTransform
{
    Q_OBJECT

public:
    explicit Q_INVOKABLE GY_Bezel(const QString &guid,QGraphicsItem *parent = nullptr);
    ~GY_Bezel();
    /**
     * @brief setContainerEditPointF 设置编辑点
     */
    void setContainerEditPointF();
    //!继承基类重写
    GY_Object * copyItem(const QString &guid = QString());
    /**
     * @brief addItem 组中添加图元
     * @param item
     * @return
     */
    virtual bool addItem(GY_Object *pItem);
    /**
     * @brief removItem 移除组中的图元
     * @param guid 图元的guid
     * @return 是否移除成功
     */
    virtual bool removItem(const QString &guid);
    /**
     * @brief removItem 移除图元
     * @param pItem 图元指针
     * @return 是否移除成功
     */
    virtual bool removItem(const GY_Object *pItem);

private:
    //组成按键的图形
    GY_GraphicsRectItem *m_pBackground = nullptr;
    GY_GraphicsRectItem *m_pFocusOutline = nullptr;
    GY_GraphicsPolygon *m_pTopLeft = nullptr;
    GY_GraphicsPolygon *m_pRight = nullptr;
    GY_GraphicsPolygon *m_pBottom = nullptr;
    GY_ColorArray *m_pBezelColors = nullptr;
    //设置图形变化逻辑
    void setBackground();
    void setFocusOutline();
    void setTopLeft();
    void setRight();
    void setBottom();
    void setBezelColors();
    /**
     * @brief updateSelfProperty 更新自身属性
     */
    void updateSelfProperty();

private:
    /**
     * @brief initializationPropertyInfo 初始化属性信息
     */
    void initializationPropertyInfo();
    /**
     * @brief updatePosition 更新位置
     * @param name 属性名称
     * @param value 位置
     * @return 是否更新成功
     */
    bool updatePosition(const QString &name, const QVariant &value);
    /**
     * @brief updatePosition 是否隐藏
     * @param name 属性名称
     * @param value bool值
     * @return 是否更新成功
     */
    bool updateIsVisible(const QString &name, const QVariant &value);
    /**
     * @brief updatePoint 更新点位
     * @param name 属性名称
     * @param value 坐标点
     * @return 是否更新成功
     */
    bool updatePoint(const QString &name, const QVariant &value);
    /**
     * @brief updateSize 更新相对中心点位
     * @param name 属性名称
     * @param value 坐标点
     * @return 是否更新成功
     */
    bool updateSize(const QString &name, const QVariant &value);
    /**
     * @brief updateDepthp 更新Depth点位
     * @param name 属性名称
     * @param value 坐标点
     * @return 是否更新成功
     */
    bool updateDepthp(const QString &name, const QVariant &value);
    /**
     * @brief updateDepth 更新
     * @param name 属性名称
     * @param value 坐标点
     * @return 是否更新成功
     */
    bool updateDepth(const QString &name, const QVariant &value);
    /**
     * @brief updateEnabled 更新
     * @param name 属性名称
     * @param value 坐标点
     * @return 是否更新成功
     */
    bool updateEnabled(const QString &name, const QVariant &value);
    /**
     * @brief updatePressed 更新
     * @param name 属性名称
     * @param value 坐标点
     * @return 是否更新成功
     */
    bool updatePressed(const QString &name, const QVariant &value);
    /**
     * @brief updateShowBottom 更新
     * @param name 属性名称
     * @param value 坐标点
     * @return 是否更新成功
     */
    bool updateShowBottom(const QString &name, const QVariant &value);
    /**
     * @brief updateFocused 更新
     * @param name 属性名称
     * @param value 坐标点
     * @return 是否更新成功
     */
    bool updateFocused(const QString &name, const QVariant &value);

};

#endif // GY_BEZEL_H
